/**
 * 微信SDK工具类
 */
import { getWxConfig } from '../api/user'

export default class WechatUtil {
  /**
   * 初始化微信JSSDK配置
   * @param {Array} jsApiList 需要使用的JS接口列表
   * @returns {Promise}
   */
  static async initJsSdk(jsApiList = [
    'updateAppMessageShareData',
    'updateTimelineShareData',
    'onMenuShareTimeline',
    'onMenuShareAppMessage',
    'chooseWXPay',
    'getLocation'
  ]) {
    try {
      // 判断是否是微信环境
      if (!WechatUtil.isWechatBrowser()) {
        console.log('非微信环境，不初始化SDK')
        return false
      }

      // 获取当前页面URL
      const url = window.location.href.split('#')[0]
      
      // 获取微信配置
      const res = await getWxConfig(url)
      
      if (res.code !== 0 || !res.data) {
        console.error('获取微信配置失败')
        return false
      }
      
      const config = res.data
      
      // 配置微信JS SDK
      return new Promise((resolve) => {
        if (!window.wx) {
          console.error('微信JSSDK未加载')
          resolve(false)
          return
        }
        
        window.wx.config({
          debug: process.env.NODE_ENV === 'development',
          appId: config.appId,
          timestamp: config.timestamp,
          nonceStr: config.nonceStr,
          signature: config.signature,
          jsApiList
        })
        
        window.wx.ready(() => {
          console.log('微信JS SDK初始化成功')
          resolve(true)
        })
        
        window.wx.error((err) => {
          console.error('微信JS SDK初始化失败', err)
          resolve(false)
        })
      })
    } catch (error) {
      console.error('初始化微信JS SDK失败', error)
      return false
    }
  }
  
  /**
   * 设置分享信息
   * @param {Object} shareInfo 分享信息
   * @returns {boolean} 设置结果
   */
  static setShareInfo(shareInfo = {}) {
    try {
      if (!window.wx) {
        console.error('微信JSSDK未加载')
        return false
      }
      
      const defaultInfo = {
        title: '数独游戏',
        desc: '快来挑战数独游戏，锻炼你的大脑！',
        link: window.location.href,
        imgUrl: '/logo.png',
        success: function() {
          console.log('分享成功')
        },
        cancel: function() {
          console.log('取消分享')
        }
      }
      
      const info = Object.assign({}, defaultInfo, shareInfo)
      
      // 分享给朋友
      window.wx.updateAppMessageShareData(info)
      
      // 分享到朋友圈
      window.wx.updateTimelineShareData(info)
      
      // 兼容旧版本
      window.wx.onMenuShareAppMessage(info)
      window.wx.onMenuShareTimeline(info)
      
      return true
    } catch (error) {
      console.error('设置分享信息失败', error)
      return false
    }
  }
  
  /**
   * 获取微信授权code
   * @param {string} redirectUri 授权后重定向的回调链接地址
   * @param {string} scope 应用授权作用域
   * @returns {void}
   */
  static getAuthCode(redirectUri, scope = 'snsapi_userinfo') {
    try {
      const appId = process.env.VUE_APP_WECHAT_APPID
      const url = encodeURIComponent(redirectUri)
      const authUrl = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appId}&redirect_uri=${url}&response_type=code&scope=${scope}&state=STATE#wechat_redirect`
      
      window.location.href = authUrl
      return true
    } catch (error) {
      console.error('获取微信授权码失败', error)
      return false
    }
  }
  
  /**
   * 从URL中获取微信授权码
   * @returns {string|null} 授权码
   */
  static getCodeFromUrl() {
    try {
      const url = window.location.search
      const reg = new RegExp('(^|&)code=([^&]*)(&|$)')
      const match = url.substr(1).match(reg)
      
      if (match) {
        return match[2]
      }
      
      return null
    } catch (error) {
      console.error('从URL获取授权码失败', error)
      return null
    }
  }
  
  /**
   * 判断是否在微信浏览器中
   * @returns {boolean}
   */
  static isWechatBrowser() {
    try {
      const ua = navigator.userAgent.toLowerCase()
      return ua.indexOf('micromessenger') !== -1
    } catch (error) {
      console.error('判断是否在微信浏览器中失败', error)
      return false
    }
  }
  
  /**
   * 发起微信支付
   * @param {Object} payParams 支付参数
   * @returns {Promise}
   */
  static wxPay(payParams) {
    return new Promise((resolve, reject) => {
      try {
        if (!window.wx) {
          const error = new Error('微信JSSDK未加载')
          console.error(error)
          reject(error)
          return
        }
        
        window.wx.chooseWXPay({
          timestamp: payParams.timestamp,
          nonceStr: payParams.nonceStr,
          package: payParams.package,
          signType: payParams.signType,
          paySign: payParams.paySign,
          success: function(res) {
            resolve(res)
          },
          cancel: function() {
            const error = new Error('用户取消支付')
            console.log(error)
            reject(error)
          },
          fail: function(res) {
            console.error('微信支付失败', res)
            reject(res)
          }
        })
      } catch (error) {
        console.error('发起微信支付失败', error)
        reject(error)
      }
    })
  }
}
